package com.doubao.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doubao.common.result.Result;
import com.doubao.user.dto.response.UserNotificationResponse;
import com.doubao.user.entity.UserNotification;

import java.util.List;

/**
 * 用户通知服务接口
 */
public interface UserNotificationService {

    /**
     * 发送通知
     *
     * @param userId  用户ID
     * @param type    通知类型
     * @param title   标题
     * @param content 内容
     * @param link    相关链接
     * @return 发送结果
     */
    Result<Void> sendNotification(Long userId, String type, String title, String content, String link);

    /**
     * 批量发送通知
     *
     * @param userIds 用户ID列表
     * @param type    通知类型
     * @param title   标题
     * @param content 内容
     * @param link    相关链接
     * @return 发送结果
     */
    Result<Void> batchSendNotification(List<Long> userIds, String type, String title, String content, String link);

    /**
     * 获取用户通知列表（分页）
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 通知列表
     */
    IPage<UserNotificationResponse> getUserNotifications(Long userId, int page, int size);

    /**
     * 获取用户未读通知数量
     *
     * @param userId 用户ID
     * @return 未读通知数量
     */
    int getUnreadCount(Long userId);

    /**
     * 将通知标记为已读
     *
     * @param notificationId 通知ID
     * @return 操作结果
     */
    Result<Void> markAsRead(Long notificationId);

    /**
     * 将用户所有通知标记为已读
     *
     * @param userId 用户ID
     * @return 操作结果
     */
    Result<Void> markAllAsRead(Long userId);

    /**
     * 将指定类型的通知标记为已读
     *
     * @param userId 用户ID
     * @param type   通知类型
     * @return 操作结果
     */
    Result<Void> markTypeAsRead(Long userId, String type);

    /**
     * 删除通知
     *
     * @param notificationId 通知ID
     * @return 操作结果
     */
    Result<Void> deleteNotification(Long notificationId);

    /**
     * 清空用户所有通知
     *
     * @param userId 用户ID
     * @return 操作结果
     */
    Result<Void> clearAllNotifications(Long userId);

    /**
     * 获取用户最新通知
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 最新通知列表
     */
    List<UserNotificationResponse> getLatestNotifications(Long userId, int limit);
}